}
ret = get_gpfn_from_mfn(arg0);
break;
- case IA64_DOM0VP_populate_physmap:
- ret = dom0vp_populate_physmap(d, arg0,
- (unsigned int)arg1, (unsigned int)arg2);
- break;
case IA64_DOM0VP_zap_physmap:
ret = dom0vp_zap_physmap(d, arg0, (unsigned int)arg1);
break;
}
#ifdef CONFIG_XEN_IA64_DOM0_VP
-//XXX SMP
-unsigned long
-dom0vp_populate_physmap(struct domain *d, unsigned long gpfn,
- unsigned int extent_order, unsigned int address_bits)
-{
- unsigned long ret = 0;
- int flags = 0;
- unsigned long mpaddr = gpfn << PAGE_SHIFT;
- unsigned long extent_size = 1UL << extent_order;
- unsigned long offset;
- struct page_info* page;
- unsigned long physaddr;
-
- if (extent_order > 0 && !multipage_allocation_permitted(d)) {
- ret = -EINVAL;
- goto out;
- }
-
- if (gpfn + (1 << extent_order) < gpfn) {
- ret = -EINVAL;
- goto out;
- }
- if (gpfn > d->max_pages || gpfn + (1 << extent_order) > d->max_pages) {
- ret = -EINVAL;
- goto out;
- }
- if ((extent_size << PAGE_SHIFT) < extent_size) {
- ret = -EINVAL;
- goto out;
- }
-
- //XXX check address_bits and set flags = ALLOC_DOM_DMA if needed
-
- // check the rage is not populated yet.
- //XXX loop optimization
- for (offset = 0; offset < extent_size << PAGE_SHIFT; offset += PAGE_SIZE) {
- if (____lookup_domain_mpa(d, mpaddr + offset) != INVALID_MFN) {
- ret = -EBUSY;
- goto out;
- }
- }
-
- page = alloc_domheap_pages(d, extent_order, flags);
- if (page == NULL) {
- ret = -ENOMEM;
- DPRINTK("Could not allocate order=%d extent: id=%d flags=%x\n",
- extent_order, d->domain_id, flags);
- goto out;
- }
-
- //XXX loop optimization
- physaddr = page_to_maddr(page);
- for (offset = 0; offset < extent_size << PAGE_SHIFT; offset += PAGE_SIZE) {
- assign_domain_page(d, mpaddr + offset, physaddr + offset);
- }
-
-out:
- return ret;
-}
-
//XXX SMP
unsigned long
dom0vp_zap_physmap(struct domain *d, unsigned long gpfn,
unsigned long assign_domain_mmio_page(struct domain *d, unsigned long mpaddr, unsigned long size);
unsigned long assign_domain_mach_page(struct domain *d, unsigned long mpaddr, unsigned long size);
unsigned long do_dom0vp_op(unsigned long cmd, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3);
-unsigned long dom0vp_populate_physmap(struct domain *d, unsigned long gpfn, unsigned int extent_order, unsigned int address_bits);
unsigned long dom0vp_zap_physmap(struct domain *d, unsigned long gpfn, unsigned int extent_order);
unsigned long dom0vp_add_physmap(struct domain* d, unsigned long gpfn, unsigned long mfn, unsigned int flags, domid_t domid);
#endif
// to the corresponding
// pseudo physical page frame
// number of the caller domain
-#define IA64_DOM0VP_populate_physmap 16 // allocate machine-contigusous
- // memory region and
- // map it to pseudo physical
- // address
#define IA64_DOM0VP_zap_physmap 17 // unmap and free pages
// contained in the specified
// pseudo physical region